\begin{tikzpicture}[node distance=10ex]

	%
	% init
	%
	\labeledcompoundnode{init}
	                    {component}
	                    {Init}{

		\rpcobjectrnode{parentgui}{node distance=3.5ex}{}{Parent}
		\node[capability, right of=parentgui] (rootcap) {};
		\upwardthreadnode{initthread}{below=0ex of rootcap}
		\rpcobjectrnode{parentlauncher}{node distance=3.5ex, xshift=7ex,
		                               right of=rootcap, opacity=0.5}{}{Parent}
	}

	%
	% launcher
	%
	\labeledcompoundnode{launcher}
	                    {component, above=5ex of init, xshift=15ex}
	                    {Launcher}{
		\rpcobjectrnode{parentapplication}{node distance=3.5ex}{}{Parent}
		\downwardthreadnode{launcherthread}{below of=parentapplication,
		                                    node distance=4ex}
		\node[capability, below=0ex of launcherthread] (launcherparentcap) {};
	}

	%
	% application
	%
	\labeledcompoundnode{application}
	                    {component, above=5ex of launcher, xshift=8ex,
	                     minimum width=15ex}
	                    {Application}{
		\downwardthreadnode{applicationthread}{}
		\node[capability, below=0ex of applicationthread] (applicationparentcap) {};
		\node[capability, below=0ex of applicationthread, xshift=-6ex] (sessioncap) {};
	}

	%
	% gui
	%
	\labeledcompoundnode{gui}
	                    {component, above=5ex of init, xshift=-12ex}
	                    {GUI}{
		\rpcobjectrnode{guisession}{node distance=6.5ex}{}{GUI session}
		\rpcobjectrnode{guiroot}{below of=guisession, yshift=-5ex, node distance=5ex}{}{GUI root}
		\downwardthreadnode{guithread}{below of=guiroot, text opacity=0, node distance=4ex}
		\node[capability, below=0ex of guithread] (guiparentcap) {};
	}

	% session call from application to launcher
	\path[arrow] (applicationparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6, text opacity=0]
	                            {$session$("GUI", label:browser)} (parentapplicationobj);

	% session call from launcher to init
	\path[arrow] (launcherparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6, xshift=8ex, text opacity=0]
	                            {$session$("GUI", label:arora)} (parentlauncherobj);

	% root call from init to gui
	\path[arrow] (rootcap) .. controls +(0,4ex) and +(4ex,-4ex)
	                            .. node [sloped=false, pos=0.3, xshift=-6ex]
	                            {$session$(label:arora)} (guirootobj);

	% session creation
	\path[arrow] (guirootobj) -- node [sloped=false, pos=0.3]
	                            {$create$} (guisessionobj);

	% invisible, just for keeping the layout consistent with announce.tikz
	\path (guiparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6, xshift=-10ex, text opacity=0]
	                            {$announce$("GUI", 3)} (parentguiobj);

	% capability delegations
	\path [draw, dashed, opacity=0.3] (guirootcap)           .. controls +(5ex,-5ex) and +(0,5ex) .. (rootcap);
	\path [draw, dashed, opacity=0.3] (guiparentcap)         .. controls +(0ex,-8ex) and +(0,5ex) .. (parentguicap);
	\path [draw, dashed, opacity=0.3] (applicationparentcap) .. controls +(0ex,-5ex) and +(0,5ex) .. (parentapplicationcap);
	\path [draw, dashed, opacity=0.3] (launcherparentcap)    .. controls +(0ex,-5ex) and +(0,5ex) .. (parentlaunchercap);

	\path [draw, dashed] (guisessioncap) -- (sessioncap);

\end{tikzpicture}
